#include <iostream>
#include "contacts.pb.h"
#include <string>
#include <fstream>

void AddPeopleInfo(s_contacts::People *person)
{
    std::cout << "--------------新增联系人--------------" << std::endl;
    std::cout << "请输入联系人的姓名: ";
    std::string name;
    getline(std::cin, name);
    person->set_name(name);

    // std::cout << "请输入联系人的年龄: ";
    // int age;
    // std::cin >> age;
    // person->set_age(age);
    // std::cin.ignore(256, '\n'); // 清除缓冲区所有内容，直到'\n'，把'\n'删除后结束，或者清除256个字节直接结束
    std::cout << "请输入联系人的生日: ";
    int birthday;
    std::cin >> birthday;
    person->set_birthday(birthday);
    std::cin.ignore(256, '\n'); // 清除缓冲区所有内容，直到'\n'，把'\n'删除后结束，或者清除256个字节直接结束

    while(1)
    {
        std::cout << "请输入联系人的电话,(只输入空格完成新增): "; 
        std::string num;
        getline(std::cin,num);
        if(num.empty())
            break;
        s_contacts::People_Phone * phone = person->add_phone();
        phone->set_num(num);
    }
    
    std::cout << "--------------添加联系人成功--------------" << std::endl;
}

int main()
{
    s_contacts::Contacts contacts;
    // 读取通讯录文件中的联系人，没有就创建
    std::ifstream input("../contacts.bin", std::ios::in | std::ios::binary);
    if (!input)
        std::cout << "contacts.bin not find, create new file" << std::endl;
    else if (!contacts.ParseFromIstream(&input)) // 这个函数解决了：1.读取文件  2.反序列化到contacts
    {
        std::cerr << "Parse error" << std::endl;
        input.close();
        return -1;
    }
    // 走到这里，表示通讯录对象contacts已经读取成功，不管有没有数据
    // 向通讯录新加一个人的信息
    AddPeopleInfo(contacts.add_person()); // 调用add_person 表示即将新加进去的person信息已经开辟好空间了

    // 将通讯录写入文件中
    std::ofstream output("../contacts.bin", std::ios::out | std::ios::binary | std::ios::trunc); // 覆盖写
    if (!contacts.SerializePartialToOstream(&output))                                         // 这个函数解决了：写入序列化的通讯录到文件
    {
        std::cerr << "write error" << std::endl;
        input.close();
        output.close();
    }

    // 走到这里，成功写入
    std::cerr << "write success" << std::endl;
    input.close();
    output.close();
    return 0;
}